Skip to content
Loafacto 문서/참고 문서/web-ui 문서/21. supabase-feature-builder-meta.sql

21. supabase-feature-builder-meta.sql

원본 파일: 'C:\Repository\loafacto-hub\docs\web-ui\21. supabase-feature-builder-meta.sql'

sql
-- =============================================================================
-- feature_builder_meta: 홈 카드 전역 버전 관리 테이블
-- 목적:
--   - 기능 빌더(홈 카드) 구성이 코드/운영에서 바뀌었을 때,
--     관리자 화면에서 "전 사용자 홈 카드 초기화" 버튼으로
--     모든 사용자의 localStorage 캐시를 무시하고 기본값으로 되돌리기 위함.
--   - web-ui는 이 테이블의 version 값을 보고
--     localStorage('loafacto-feature-builder')를 초기화할지 결정한다.
--
-- 연동되는 프론트 코드:
--   - apps/web-ui/src/stores/featureBuilder.ts
--       - syncRemoteVersion()
--   - apps/web-ui/src/pages/admin/AdminSettings.vue
--       - onResetHomeCards()
-- =============================================================================

-- 1. 메타 테이블 생성
CREATE TABLE IF NOT EXISTS public.feature_builder_meta (
  id text PRIMARY KEY,
  version integer NOT NULL DEFAULT 0,
  updated_at timestamptz NOT NULL DEFAULT now()
);

COMMENT ON TABLE public.feature_builder_meta IS
  '홈 카드(기능 빌더) 전역 버전 관리용 메타 테이블. id=''global'' 행의 version이 변경되면 모든 사용자의 홈 카드 구성을 기본값으로 초기화한다.';

COMMENT ON COLUMN public.feature_builder_meta.id IS
  '메타 키. web-ui에서는 id=''global'' 행의 version만 사용한다.';

COMMENT ON COLUMN public.feature_builder_meta.version IS
  '홈 카드 전역 버전. 증가할 때마다 모든 사용자 localStorage 기반 홈 카드 캐시를 무효화하고 코드 기본값으로 초기화한다.';

COMMENT ON COLUMN public.feature_builder_meta.updated_at IS
  '버전 갱신 시각.';

-- 2. 초기 행 준비 (최초 1회 실행 시)
INSERT INTO public.feature_builder_meta (id, version)
VALUES ('global', 1)
ON CONFLICT (id) DO NOTHING;

-- 3. RLS 설정 (선택사항: RLS를 사용하는 프로젝트일 경우)
--    - 기본 전략:
--      * super_admin / operator: SELECT, UPDATE, INSERT 가능
--      * 그 외 사용자는 접근 불가
--
--    user_roles(user_id, role) 테이블과 01. supabase-user-roles.sql을 사용한다고 가정.

ALTER TABLE public.feature_builder_meta ENABLE ROW LEVEL SECURITY;

CREATE POLICY "feature_builder_meta: admin select"
ON public.feature_builder_meta
FOR SELECT
TO authenticated
USING (
  EXISTS (
    SELECT 1
    FROM public.user_roles
    WHERE user_id = auth.uid()
      AND role IN ('super_admin', 'operator')
  )
);

CREATE POLICY "feature_builder_meta: admin insert"
ON public.feature_builder_meta
FOR INSERT
TO authenticated
WITH CHECK (
  EXISTS (
    SELECT 1
    FROM public.user_roles
    WHERE user_id = auth.uid()
      AND role IN ('super_admin', 'operator')
  )
);

CREATE POLICY "feature_builder_meta: admin update"
ON public.feature_builder_meta
FOR UPDATE
TO authenticated
USING (
  EXISTS (
    SELECT 1
    FROM public.user_roles
    WHERE user_id = auth.uid()
      AND role IN ('super_admin', 'operator')
  )
)
WITH CHECK (
  EXISTS (
    SELECT 1
    FROM public.user_roles
    WHERE user_id = auth.uid()
      AND role IN ('super_admin', 'operator')
  )
);